# -*- coding: utf-8 -*-
class A:
    def __new__(cls, *args, **kwargs):
        """从Class建立一个object的过程"""
        print('__new__, 从Class建立一个object的过程')
        print(cls, args, kwargs)
        return super().__new__(cls)

    def __init__(self, *args, **kwargs):
        print('__init__，　object建立以后，初始化的过程')
        print(args, kwargs)

    def __call__(self, *args, **kwargs):
        print('__call__，　object被调用时，执行的过程')
        print(args, kwargs)

    def __del__(self):
        """
        object被销毁前的清理工作
        del函数和__del__并没有必然的关系，del一个对象，只是让该对象减少一个引用，当引用计数为０，对象为销毁时，才会触发__del__
        :return:
        """
        print('__del__，　object被销毁前的清理工作')

    def __str__(self):
        """返回更有语义，人类更易理解的内容"""
        return '<A> __str__'

    def __repr__(self):
        """返回更详细的内容，以帮助开发调试程序"""
        return '<A> __repr__'

    def __format__(self, format_spec):
        """
        格式化输出
        :param format_spec:
        :return:
        """
        if format_spec == 'X':
            return '0XA'
        return '<A>'

    def __bytes__(self):
        """
        返回一个bytes对象
        :return:
        """
        print('__bytes__，　返回一个bytes对象')
        return bytes([0, 1])



if __name__ == '__main__':
    # 初始化的参数既会传到__init__里，又会传到__new__中
    a = A('vincent', age=20)
    # obj = __new__(A)
    # __init__(obj)

    b = a
    del b
    print('del b 并不一定会触发 __del__, 它只会减少一个引用')
    a('a', b='b')
    print('finish, 程序运行结束')
    print(str(a))
    print(repr(a))
    print(a)

    print("{}".format(a))
    print("{!r}".format(a))
    print("{!s}".format(a))
    print("{:X}".format(a))

    num = 15
    print("{}".format(num))
    print("{:b}".format(num))
    print("{:#b}".format(num))
    print("{:#x}".format(num))
    print("{:x}".format(num))
    print("{:#X}".format(num))

    print(bytes(a))




